package com.kinglone.back.module.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.kinglone.back.module.dao.ModuleMapper;
import com.kinglone.back.module.model.Module;
import com.kinglone.back.module.service.ModuleService;
import com.kinglone.back.permission.dao.PermissionMapper;
import com.kinglone.back.permission.model.Permission;
import com.kinglone.back.permission.service.PermissionService;
import com.kinglone.back.user.model.User;
import com.kinglone.back.user.model.UserPopedom;
import com.kinglone.common.utils.StringUtil;

@Service("moduleService")
public class ModuleServiceImpl implements ModuleService {

	@Autowired
	private ModuleMapper moduleDao;

	@Override
	public String findAllModule(){
		
		try {
			List<Module> Modules = moduleDao.findAllModule();
			JSONArray arr = new JSONArray();
			
			for(int i=0;i<Modules.size();i++){
				Module module = Modules.get(i);
				String id = module.getId();
				JSONObject obj = new JSONObject();
				obj.put("id", id);
				obj.put("pid", id.length()==4?"1":id.substring(0, id.length()-4));
				obj.put("name", module.getName());
				//obj.put("title", module.getName());
				arr.add(obj);
			}
			System.out.println("arr:"+arr);
			return arr.toString();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
		
	}

	@Override
	public List<Module> getModulesByParent(String pid) {
		return moduleDao.getModulesByParent(pid);
	}

	/**
	 * 添加子模块
	 */
	@Override
	public void moduleSave(Module module) {	
		//计算模块id
		String pid = module.getPid();
		String maxSid = moduleDao.findMaxSidByPid(pid);//根据pid获取最大的子id
		String id="";
		if("0".equals(pid)){//父id为一级
			id=String.valueOf(Integer.parseInt(maxSid)+1);
		}else if(pid.length()==4){//父id为二级
			if(StringUtil.isEmpty(maxSid)){
				id=pid +"0001";
			}else{
				id=String.valueOf(Integer.parseInt(maxSid)+1);
			}
		}else{//父id为三级
			if(StringUtil.isEmpty(maxSid)){
				id=pid +"00010001";
			}else{
				id=String.valueOf(Integer.parseInt(maxSid)+1);
			}
		}				
		module.setId(id);
		moduleDao.moduleSave(module);	
	}

	/**
	 * 删除模块
	 */
	@Override
	public void moduleDel(String id) {
		moduleDao.moduleDel(id);	
	}

	/**
	 * 根据用户id查询用户权限信息
	 */
	@Override
	public List<UserPopedom> findOperasModules(User user) {
		
		List<UserPopedom> userPopedoms = null;
		try {
			//根据用户id获取到的第二级模块的code
			List<String> codes = moduleDao.findOperasModules(user.getId());
			if(codes!=null && codes.size()>0){
			//	String firstModule = null;
				   
				List<String> secondModules = null;
				   
			   //定义map集合用于存放一级和二级模块信息   一级和二级模块信息必须对应好 
			   Map<String,List<String>> modules = new HashMap<>();
			   
			   for(int i=0;i<codes.size();i++){
				 //获取二级模块的code
				  String seCode = codes.get(i);//00010001
				//获取一级模块的code
				  String fiCode = seCode.substring(0, seCode.length()-4);//0001
				//根据一级模块的id获取模块信息
				  //firstModule = permissionDao.getFirstModuleByFiCode(fiCode);
				  //填充一级模块信息    一级模块作为map集合的key
				   if(!modules.containsKey(fiCode)){
					   //用于存放二级模块
					   secondModules = new ArrayList<>();
					   //将一级模块的信息存放在map集合中
					   modules.put(fiCode, secondModules);
				   } 
				   //填充二级模块信息   二级模块作为map集合的value
				  // Permission secondModule =permissionDao.getFirstModuleByFiCode(seCode);
				   secondModules.add(seCode);
				   
			   }
			   //创建集合，将Map<Module,List<Module>> modules中的数据都存进去    便于在页面通过c:forEeach取数据
			   userPopedoms = new ArrayList<>();
			   
			   for(Entry<String,List<String>> data : modules.entrySet()){
				   UserPopedom userPopedom = new UserPopedom();
				   Module firstModule= moduleDao.getFirstModuleByFiCode(data.getKey());
				   userPopedom.setFirstModule(firstModule);
				   List<String> secondModulesId = data.getValue();
				   List<Module> secondModuleList =  new ArrayList<>();
				   for(int i=0;i<secondModulesId.size();i++){
					   Module secondModule= moduleDao.getFirstModuleByFiCode(secondModulesId.get(i));
					   secondModuleList.add(secondModule);
				   }
				   userPopedom.setSecondModules(secondModuleList);				   
				   userPopedoms.add(userPopedom);
			   }
			   
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return userPopedoms;
	}

	/**
	 * 根据id查询模块信息
	 */
	@Override
	public Module findModuleById(String id) {
		
		return moduleDao.findModuleById(id);
	}

	/**
	 * 修改模块
	 */
	@Override
	public void update(Module module) {
		moduleDao.update(module);		
	}
}
